/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;
import model.dto.LocalDTO;

/**
 *
 * @author Gabriel
 */
public class LocalDAO extends DAO {
    
    private static final String SQL_LOCAL = 
                                            "SELECT Id,\n" +
                                            "       Endereco,\n" +
                                            "       Cidade,\n" +
                                            "       Bairro,\n" +	
                                            "       Estado,\n" +	
                                            "FROM Local\n" +
                                            "WHERE 1=1\n";

    public LocalDAO() throws SQLException, ClassNotFoundException {
        super();
    }
    
    private LocalDTO getLocalCorrenteResultSet (ResultSet rs) throws SQLException {
        LocalDTO localDTO = new LocalDTO();
        localDTO.setId(rs.getInt("Id"));
        localDTO.setBairro(rs.getString("Bairro"));
        localDTO.setCidade(rs.getString("Cidade"));
        localDTO.setEndereco(rs.getString("Endereco"));
        localDTO.setEstado(rs.getString("Estado"));
        return localDTO;
    }
    
    private LinkedList<LocalDTO> getLocaisResultSet(ResultSet rs) throws SQLException {
        LinkedList<LocalDTO> locaisDTO = new LinkedList<LocalDTO>();
        while (rs.next()) {
            locaisDTO.add(getLocalCorrenteResultSet(rs));
        }
        return locaisDTO;
    }
    
    public LinkedList<LocalDTO> getTodosLocais() throws SQLException {
        sql = SQL_LOCAL + ";";
        connector.executeSelectQuery(sql);
        return getLocaisResultSet(resultSet);      
    }
    
    public LinkedList<LocalDTO> pesquisaLocal(Integer id, 
                                              String endereco, 
                                              String bairro, 
                                              String cidade, 
                                              String estado) throws SQLException {
        sql = SQL_LOCAL;
        
        if (id != null) {
            sql += "  AND Id = " + id + "\n";
        }
        
        if (endereco != null) {
            sql += "  AND Endereco LIKE '%" + endereco + "%'\n";
        }
        
        if (bairro != null) {
            sql += "  AND Bairro LIKE '%" + bairro + "%'\n";
        }
        
        if (cidade != null) {
            sql += "  AND Ciade LIKE '%" + cidade + "%'\n";
        }
        
        if (estado != null) {
            sql += "  AND Estado LIKE '%" + estado + "%'\n";
        }
        
        sql += ";";
        
        connector.executeSelectQuery(sql);
        return getLocaisResultSet(resultSet);
    }
    
    public void insereLocal (LocalDTO localDTO) throws SQLException {
        sql = "INSERT INTO LOCAL (ENDERECO, CIDADE, BAIRRO, ESTADO) " +
              "VALUES (" + localDTO.getEndereco() + "," + localDTO.getCidade() + "," + localDTO.getBairro() + "," + localDTO.getEstado() + ")";  
       connector.executeInsertQuery(sql);
    }
    
    public void atuaLizaLocal(LocalDTO localDTO, 
                              boolean atualizaEstado,
                              boolean atualizaCidade,
                              boolean atualizaBairro,
                              boolean atualizaEndereco) throws SQLException {
        
        /* O booleano abaixo informa se a instrução SQL ainda não recebeu nenhuma
           atualização. Desta maneira é possível saber se a condição virá precedida
           de uma vírgula ou não. */
        boolean naoPossuiAtualizacaoAinda = true;
        

        
        sql = "UPDATE LOCAL\n" +
              "SET ";
        
        if (atualizaEstado) {
            sql += "Estado = " + localDTO.getEstado() + "\n";
            naoPossuiAtualizacaoAinda = false;
        }
        
        if (atualizaCidade) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Cidade = " + localDTO.getCidade() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Cidade = " + localDTO.getCidade() + "\n";
            }
        }
        
        if (atualizaEndereco) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Endereco = " + localDTO.getEndereco() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Endereco = " + localDTO.getEndereco() + "\n";
            }
        }
        
        if (atualizaBairro) {
            if (naoPossuiAtualizacaoAinda) {
                sql += "Bairro = " + localDTO.getBairro() + "\n";
                naoPossuiAtualizacaoAinda = false;
            } else {
                sql += ",Bairro = " + localDTO.getBairro() + "\n";
            }
        }
        

        
        sql += "WHERE Id = " + localDTO.getId() + ";";
        
        connector.executeUpdateQuery(sql);
    }
           
}
